"""
@name : 7.静态方法、实例方法、类方法
@author : wenyao
@projectname: sanchuanglianxi
"""
#
class Tst:
    name = "tst"
    data = "this is data"

    def __init__(self):
        self.a = "a"

    #普通方法
    def normal_method(self, name):
        print("normal:")
        print(type(self))
        print(self.data, name)

    def __new__(cls):
        print("_new__")
        return object.__new__(cls)

    #类方法
    @classmethod
    def class_method(cls, name):
        print("classmethod:")
        #print(cls.a)
        print(type(cls))
        print(cls.data,name)

    #静态方法
    @staticmethod
    def static_method(name):
        print('static_method:')
        print(name, Tst.data)
    # @staticmethod
    # def static_method2():
    #     print("static_method2")

cls1 = Tst()
# #实例调用  类方法、实例方法、静态方法都能通过实例去调用
# cls1.class_method('classmethod')
# cls1.normal_method('normal_method')
# #cls1.static_method("static_method")
# cls1.static_method2()

#
#实例方法 需要实例对象去访问  类方法和静态方法  可以通过类名去调用
Tst.normal_method(cls1, "normal_method")
Tst.class_method("class_method")
Tst.static_method("static_method")

#总结
#1、实例方法
#实例方法 只能通过类对象调用，需要类对象作为参数。实例方法内部通过 self.属性名 访问
#类属性和实例属性。使用对象调用实例方法时，第一个参数可以不用传，代表实例本身。
#2、类方法
#类方法  可以通过实例调用，也可以通过类调用。使用 cls.属性名  访问类属性。
#使用类和实例调用的时候第一个参数可以不传，代表类本身。
#前面加@classmethod
#3、静态方法
#静态方法  可以通过实例对象、类名调用，但是每个参数必须传递。方法内部 通过 类名.属性 访问类属性
#前面加@staticmethod